import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
// import { getToken } from '@/utils/auth'
import router from '@/router'
import { fd } from "@/utils";
// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 1000 * 120 // request timeout
})

// 还在请求的数组，用来存储请求
let cancelArr = []
// 白名单，也就是在这个里面的页面请求不会干掉没请求完的同一个请求，如 'dataStats/operateStats'
let whiteList = []
// 白名单，也就是在这个里面的接口请求不会干掉没请求完的同一个请求
let whiteUrlList = [
  '/pms-sys/SysArea/tree',
  '/pms-fs/filePrivate'
]

// request interceptor
// 添加一个service的请求拦截器
service.interceptors.request.use(
  config => {
    // config就是本次发请求的信息
    // 判断有没有token
    if (store.getters.token) {
      config.headers.token = store.getters.token
    }
    // console.log('config', config);
    if (config.method === 'post' || config.method === 'put') {
      config.data = fd(config.data)
    }
    // 处理接口传递的排序为null的时候传的是undefined的处理
    if (config.url.includes('?undefined')) {
      config.url = config.url.split('?undefined')[0]
    }
    // 判断是否在白名单内
    let findItem = whiteList.find(item => {
      if (location.href.includes(item)) {
        return true
      } else {
        return false
      }
    })
    let findUrlItem = whiteUrlList.find(item => {
      if (config.url.includes(item)) {
        return true
      } else {
        return false
      }
    })
    if (!findItem && !findUrlItem) {
      // 不在白名单内清除上次请求，保留本次
      cancelArr = cancelArr.filter(item => {
        if (item.url === config.url && item.method === config.method) {
          item.fn()
          return false
        }
        return true
      })
      config.cancelToken = new axios.CancelToken(cancelFn => {
        cancelArr.push({
          url: config.url,
          method: config.method,
          fn: cancelFn
        })
      })
    }
    return config
  },
  err => {
    return Promise.reject(err)
  }
)

// 添加响应拦截器
service.interceptors.response.use(
  function (response) {
    // 下面代码是判断登录页面是否还弹出会话超时的问题
    let str = '/'
    let url = response.config.url
    let time = url.split('/')
    time.forEach((item, index) => {
      if (index > 2) {
        str += item + '/'
      }
    })
    // 对响应数据做点什么
    let data = response.data
    // 判断登录是否有 验证码id返回，有就接收
    if (response.headers.checkcodeid) {
      store.commit('user/setCheckcodeid', response.headers.checkcodeid)
    }
    if (data.code == 1) {
      Message({
        message: '系统繁忙，请稍后再试',
        type: 'error'
      })
      return data
    }
    if (data.code == 2) {
      console.log(str)
      MessageBox.alert('会话超时', '错误Error', {
        confirmButtonText: '重新登录',
        type: 'error'
      }).then(async () => {
        await store.dispatch('user/topslogout')
        return router.push(
          `/login?redirect=${window.location.href.split('#')[1]}`
        )
      })
      return data
    }
    if (data.code == 3) {
      Message({
        message: '非法请求（后台校验异常）',
        type: 'error'
      })
      return data
    }
    if (data.code == 4) {
      Message({
        message: '非法请求（越权访问）',
        type: 'error'
      })
      return data
    }
    if (data.data && data.data.bcode != 0) {
      Message({
        message: `${data.data.bmsg}`,
        type: 'error'
      })
    }
    return data
  },
  function (error) {
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

export default service
